首先來看題目,知道題目和執行檔有關,並且看到提示說到減少 binary 的大小,猜測可能跟壓縮有關。
hint 1:What can we do to reduce the size of a binary after compiling it.
先用 ls
檢查下載了什麼,發現有一個 out 的未知檔案。
$ ls -l
total 340
-rw-rw-r-- 1 user user 336520 Mar 12 00:36 out
使用 file
去查找下載的檔案,發現是 ELF 檔案,並且發現有 stripped,代表有被壓縮。
$ file out
out: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
使用 readelf
,可以看到檔案 out 的詳細資料,這裡我們可以看到 header 的資料。
$ readelf -h out
ELF Header:
Magic: 7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - GNU
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x44ade0
Start of program headers: 64 (bytes into file)
Start of section headers: 0 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 3
Size of section headers: 64 (bytes)
Number of section headers: 0 (64)
Section header string table index: 0
執行 out,發現沒有權限,所以使用 chmod
新增執行的權限。執行後,會出現輸入密碼的提示。隨便輸入,會顯示 Access denied 。
$ chmod +x out
$ ./out
Enter the password to unlock this file: 123
You entered: 123
Access denied
想到提示,於是從網路上查到,upx 可以壓縮和解壓縮 .exe 檔案。
下載 upx 後,查看使用手冊,得知 -d
能 decompress,於是我們打算 decompress out。
$ upx -h
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2020
UPX 3.96 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020
Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..
Commands:
-1 compress faster -9 compress better
--best compress best (can be slow for big files)
-d decompress -l list compressed file
-t test compressed file -V display version number
-h give this help -L display software license
於是我們使用 upx -d
解壓縮 out,並且用 file
再次檢視 out 的詳情,發現現在顯示 not stripped ,代表解壓縮成功了。
$ upx -d out
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2020
UPX 3.96 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020
File size Ratio Format Name
-------------------- ------ ----------- -----------
872088 <- 336520 38.59% linux/amd64 out
Unpacked 1 file.
$ file out
out: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=2e06e54daad34a6d4b0c7ef71b3e1ce17ffbf6db, for GNU/Linux 3.2.0, not stripped
接著使用 strings
和 less
指令,找到 flag。其中,strings 是將檔案 (out) 中所有可列印的字元印出。
$ strings out | less
[1]+ Stopped strings out | less
而 less
是 unix/linux 中翻閱文件的一種指令,可以向前或向後查找文字,在這裡我使用 /password
的意思是向下查找 ‘password’,若是使用 ?password 就是向上查找。詳情可以參考:Linux less 命令
Enter the password to unlock this file:
You entered: %s
Password correct, please see flag: 7069636f4354467b5539585f556e5034636b314e365f42316e34526933535f65313930633366337d
Access denied
.....
:/password
最後再把 16 進位的 flag 轉為 ascii,就可以得到 flag 了。
$ echo '7069636f4354467b5539585f556e5034636b314e365f42316e34526933535f65313930633366337d' | xxd -r -p
picoCTF{U9X_UnP4ck1N6_B1n4Ri3S_e190c3f3}
小結:
學會使用 upx -d
解壓縮執行檔,並且使用 strings
和 less
找到 flag。